﻿#region

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Vin.DependencyInjection.Core.Extension;
using Vin.Event;
using Vin.Tool.AspNetCore.Constants;
using Vin.Tool.AspNetCore.EventArgs;
using Vin.Tool.AspNetCore.Extension;
using Vin.Tool.AspNetCore.Options;
using Vin.Tool.AspNetCore.Singleton;
using Vin.Tool.AsyncLocal;
using Vin.Tool.Core.JsonCategory;
using Vin.Tool.Domain.Config;

#endregion

namespace Vin.DependencyInjection.Core;

public static class DependInjectionExtension
{
    // public static ServiceProvider UseVin(this ServiceCollection service, VinInitBuilderConfig? config = null)
    // {
    //     Console.WriteLine("项目已启动，正在装载扩展...");
    //
    //     VinApp.SetVinInitBuilderConfig(config ?? new VinInitBuilderConfig());
    //
    //     #region 添加Logger
    //
    //     service.AddLogging();
    //
    //     #endregion
    //
    //     #region 初始化配置
    //
    //     service.InitConfiguration();
    //
    //     #endregion
    //
    //     #region 注入扩展
    //
    //     service.AddVinExtension();
    //
    //     #endregion
    //
    //     #region 懒加载
    //
    //     service.AddLazyResolution();
    //
    //     #endregion
    //
    //     #region 注册服务
    //
    //     service.RegisterServices();
    //
    //     #endregion
    //
    //     #region 注册Model
    //
    //     service.AddRegisterModelExtension();
    //
    //     #endregion
    //
    //     #region 使用缓存
    //
    //     service.AddMemoryCache();
    //
    //     #endregion
    //
    //     #region 注册HostService
    //
    //     service.AddHostService();
    //
    //     #endregion
    //
    //     #region 注册AsyncLocal
    //
    //     service.AddSingleton<IAsyncServiceProvider, AsyncServiceProvider>();
    //
    //     #endregion
    //
    //     #region 注入扩展
    //
    //     service.AddVinExtension();
    //
    //     #endregion
    //
    //     var provider = service.BuildServiceProvider();
    //
    //     VinApp.SetServiceProvider(provider);
    //     Console.WriteLine("扩展装载完成，服务装载完成，正在Build...");
    //
    //     return provider;
    // }
    
     public static void UseVin(this HostApplicationBuilder builder, VinInitBuilderConfig? config = null)
    {
        Console.WriteLine("项目已启动，正在装载扩展...");

        VinApp.SetWebHostEnvironment(builder.Environment);
        VinApp.SetVinInitBuilderConfig(config ?? new VinInitBuilderConfig());

        #region 初始化配置

        builder.InitConfiguration();

        #endregion

        #region 初始化Kestrel

        builder.Services.Configure<KestrelServerOptions>(options =>
        {
            options.Limits.MaxRequestBufferSize = null; // 设置为null以允许无限制大小，或设置一个具体的大小
            options.Limits.MaxRequestBodySize = null; // 设置为null以允许无限制大小，或设置一个具体的大小
            options.Limits.MinRequestBodyDataRate = null; // 设置为null以允许无限制大小，或设置一个具体的大小
            options.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(2); // 设置请求头超时时间
            options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2); // 设置KeepAlive超时时间
        });
        // builder.Services.Configure<ForwardedHeadersOptions>(options =>
        // {
        //     options.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor |
        //                                Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto;
        // });

        #endregion

        #region 注入扩展

        builder.AddVinExtension();

        #endregion

        #region 控制器

        // Add services to the container.
        // 配置路由小写
        builder.Services.AddRouting(options => options.LowercaseUrls = true);
        var mvcBuilder = builder.Services.AddControllers().AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.InitJsonSerializerOptions();
        });
        VinApp.SetMvcBuilder(mvcBuilder);

        #endregion

        #region 懒加载

        builder.Services.AddLazyResolution();

        #endregion

        #region 注册服务

        builder.Services.RegisterServices();

        #endregion

        #region 注册Model

        builder.Services.AddRegisterModelExtension();

        #endregion

        #region 注册HttpContextAccessor

        builder.Services.AddHttpContextAccessor();
        builder.Services.AddHttpClient();

        #endregion

        #region 使用缓存

        builder.Services.AddMemoryCache();

        #endregion

        #region 注册HostService

        builder.Services.AddHostService();

        #endregion

        #region 注册AsyncLocal

        builder.Services.AddSingleton<IAsyncServiceProvider, AsyncServiceProvider>();

        #endregion

        #region 注入扩展

        builder.Services.AddVinExtension();

        #endregion

        #region 注入Options

        builder.Services.AddVinOptions();

        #endregion

        Console.WriteLine("扩展装载完成，服务装载完成，正在Build...");
    }

    public static void UseVin(this IHost application, VinUseApplicationConfig? config = null)
    {
        if (VinApp.VinInitBuilderConfig == null) throw new Exception("请先调用builder.UseVin方法");
    
        Console.WriteLine("Build完成，正在初始化中间件...");
    
        #region 初始化
    
        VinApp.SetServiceProvider(application.Services);
        // VinApp.SetWebApplication(application);
        VinApp.SetVinUseApplicationConfig(config ?? new VinUseApplicationConfig());
    
        #endregion
        //
        // #region 使用静态服务
        //
        // application.UseStaticFiles();
        //
        // #endregion
        //
        // #region 使用前置自定义中间件
        //
        // application.UseVinBeforeMiddlewareExtension();
        //
        // #endregion
        //
        // #region 使用前置扩展
        //
        // application.UseVinExtensionBefore();
        //
        // #endregion
        //
        // #region 中间件
        //
        // // 使用入口中间件
        // application.UseMiddleware<VinAppEntryMiddleware>();
        //
        // #endregion
        //
        // #region 使用后置自定义中间件
        //
        // application.UseVinAfterMiddlewareExtension();
        //
        // #endregion
        //
        // #region 使用扩展
        //
        // application.UseVinExtension();
        //
        // #endregion
        //
        // application.MapControllers();
        //
        // #region 注册事件
        //
        // // 注册启动成功事件
        // application.Lifetime.ApplicationStarted.Register(() =>
        // {
        //     VinEventManager.Fire<ApplicationStartedEventArg>(null, new ApplicationStartedEventArg());
        //     var bannerOption = VinApp.GetConfig<BannerOption>();
        //     if (bannerOption.Type.HasValue && bannerOption.Type >= 0)
        //     {
        //         var content = bannerOption.Content ?? BannerConstant.GetBanner(bannerOption.Type.Value);
        //         if (!string.IsNullOrEmpty(content))
        //         {
        //             Console.WriteLine(content);
        //         }
        //     }
        // });
        //
        // application.Lifetime.ApplicationStopped.Register(() =>
        // {
        //     VinEventManager.Fire<ApplicationStoppedEventArg>(null, new ApplicationStoppedEventArg());
        // });
        //
        // application.Lifetime.ApplicationStopping.Register(() =>
        // {
        //     VinEventManager.Fire<ApplicationStoppingEventArg>(null, new ApplicationStoppingEventArg());
        // });
        //
        // #endregion
        //
        // Console.WriteLine("中间件初始化完成...");
    }
}